﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Директива external
    /// </summary>
    public class ExternalDirectiveElement : DirectiveElement
    {
        private ExpressionElement name;
        private ExternalOptionElement option;

        /// <summary>
        /// Источник (имя библиотеки/модуля/... в которой находится метод)
        /// </summary>
        public ExpressionElement Name { get { return name; } set { name = value; } }

        /// <summary>
        /// Тип экспорта (по индексу, по имени)
        /// </summary>
        public ExternalOptionElement Option { get { return option; } set { option = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Token">директива</param>
        /// <param name="Name">источник (имя библиотеки/модуля/... в которой находится метод)</param>
        /// <param name="Option">тип экспорта (по индексу, по имени)</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public ExternalDirectiveElement(TokenInfo Token, ExpressionElement Name, ExternalOptionElement Option, List<TokenInfo> Comments)
            : base(Token, Comments)
        {
            name = Name;
            option = Option;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("external {0}{1}", name, (option != null) ? string.Format(" {0}", option) : string.Empty);
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            if (name != null)
                yield return name;
            if (option != null)
                yield return option;
        }
    }
}
